Sesión 2

Curso: R Aplicado a los Proyectos de Investigación


Percy Soto-Becerra, M.D., M.Sc(c)

InkaStats Data Science Solutions | Medical Branch

2022-10-05

  https://github.com/psotob91

Visualización de datos

Agenda

  1. Visualización de datos

  2. Código paso a paso

  3. Estéticas

  4. Datos ‘tidy’

  5. El Operador Pipe

  6. Principios del manejo de datos con {dplyr}


Visualización de datos


“The simple graph has brought more information to the data analyst’s mind than any other device.” — John Tukey

  • La visualización de datos es la creación y el estudio de la representación visual de los datos.

  • Muchas herramientas para visualizar datos, R es una de ellas.

  • Muchos enfoques/sistemas dentro de R para hacer visualizaciones de datos

    • {ggplot2} es uno de ellos, y eso es lo que vamos a usar

Gramática de gráficos


 

  • Una gramática de gráficos es una herramienta que nos permite describir de manera concisa los componentes de un gráfico.

  • Es un lenguaje que permite dibujar un gráfico con palabras sencillas.

  • Uno puede describir el proceso de dibujar el gráfico con sus propias palabras y estas convertirse en gráfico.

{ggplot2} es un paquete de {tidyverse}.



  • {ggplot2} es el paquete de visualización de datos de tidyverse.

  • gg en {ggplot2} significa Gramática de gráficos.

  • Inspirado en el libro Grammar of Graphics de Leland Wilkinson

Evolución de los gráficos estadisticos


Primeros pasos con {ggplot2}


  • Data disponible en paquete {dslabs}.
library(dslabs)
data(gapminder, package = "dslabs") 

  • Veamos los datos:
  • Veamos el detalle
?gapminder

  • En algunos casos, trabajaremos con los datos del año 2000:
gapminder2000 <- gapminder %>% 
  filter(year == 2000)
  • En algunos casos, trabajaremos con los datos del año 1980 y 2000:
gapminder1980_2000 <- gapminder %>% 
  filter(year %in% c(1980, 2000))

Aspectos básicos de {ggplot2}.


  • Estructura de código para generar gráficos en {ggplot2}
ggplot(data = [dataset], 
       mapping = aes(x = [x_variable], 
                     y = [y_variable])) +
   geom_xxx() +
   other options

Componentes de {ggplot2}.


Código paso a paso

Agenda

  1. Visualización de datos

  2. Código paso a paso

  3. Estéticas

  4. Datos ‘tidy’

  5. El Operador Pipe

  6. Principios del manejo de datos con {dplyr}

Pasos para un gráfico {ggplot2}


Inicia con el data.frame gapminder

ggplot(data = gapminder)

Inicia con el data.frame gapminder, mapea year a x

ggplot(data = gapminder, 
       mapping = aes(x = year))

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy))

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy)) + 
  geom_point()

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto. Mapea continent al color de los puntos

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point()

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto. Mapea continent al color de los puntos. Titula el gráfico como “Esperanza de vida a lo largo del tiempo”

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "Esperanza de vida a lo largo del tiempo")

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto. Mapea continent al color de los puntos. Titula el gráfico como “Esperanza de vida a lo largo del tiempo” y agrega el subtitulo “Datos para Africa, Americas, Asia, Europa y Oceania”

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "Esperanza de vida a lo largo del tiempo", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania")

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto. Mapea continent al color de los puntos. Titula el gráfico como “Esperanza de vida a lo largo del tiempo” y agrega el subtitulo “Datos para Africa, Americas, Asia, Europa y Oceania”. Etiqueta los ejes x e y como “Año” y “Esperanza de Vida”, respectivamente

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "Esperanza de vida a lo largo del tiempo", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania", 
       x = "Año", y = "Esperanza de Vida")

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto. Mapea continent al color de los puntos. Titula el gráfico como “Esperanza de vida a lo largo del tiempo” y agrega el subtitulo “Datos para Africa, Americas, Asia, Europa y Oceania”. Etiqueta los ejes x e y como “Año” y “Esperanza de Vida”, respectivamente. Etiqueta la leyenda como “Continentes”

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "Esperanza de vida a lo largo del tiempo", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania", 
       x = "Año", y = "Esperanza de Vida", 
       colour = "Continentes")

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto. Mapea continent al color de los puntos. Titula el gráfico como “Esperanza de vida a lo largo del tiempo” y agrega el subtitulo “Datos para Africa, Americas, Asia, Europa y Oceania”. Etiqueta los ejes x e y como “Año” y “Esperanza de Vida”, respectivamente. Etiqueta la leyenda como “Continentes” y agrega un titulo para la fuente de datos

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "Esperanza de vida a lo largo del tiempo", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania", 
       x = "Año", y = "Esperanza de Vida", 
       colour = "Continentes", 
       caption = "Fuente: Gapminder data")

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y. Representa cada información con un punto. Mapea continent al color de los puntos. Titula el gráfico como “Esperanza de vida a lo largo del tiempo” y agrega el subtitulo “Datos para Africa, Americas, Asia, Europa y Oceania”. Etiqueta los ejes x e y como “Año” y “Esperanza de Vida”, respectivamente. Etiqueta la leyenda como “Continentes” y agrega un titulo para la fuente de datos. Finalmente, usa una escala de colores discreta que esté diseñada para preservar la visualización de personas con formas comunes discapacidad visual para los colores

ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "Esperanza de vida a lo largo del tiempo", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania", 
       x = "Año", y = "Esperanza de Vida", 
       colour = "Continentes", 
       caption = "Fuente: Gapminder data") + 
  scale_colour_viridis_d()

En resumen


ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "Esperanza de vida a lo largo del tiempo", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania", 
       x = "Año", y = "Esperanza de Vida", 
       colour = "Continentes", 
       caption = "Fuente: Gapminder data") + 
  scale_colour_viridis_d()

Inicia con el data.frame gapminder, mapea year a x y mapea life_expectancy a y.

Representa cada información con un punto.

Mapea continent al color de los puntos.

Titula el gráfico como “Esperanza de vida a lo largo del tiempo” y agrega el subtitulo “Datos para Africa, Americas, Asia, Europa y Oceania”.

Etiqueta los ejes x e y como “Año” y “Esperanza de Vida”, respectivamente.

Etiqueta la leyenda como “Continentes” y agrega un titulo para la fuente de datos.

Finalmente, usa una escala de colores discreta que esté diseñada para preservar la visualización de personas con formas comunes discapacidad visual para los colores.

Nombre de argumentos

Se puede omitir los nombres de los dos primeros argumentos cuando construimos gráficos con {ggplot2}.

ggplot(data = gapminder, 
       mapping = aes(x = gdp, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  scale_colour_viridis_d()

ggplot(gapminder, 
       aes(x = gdp, 
           y = life_expectancy, 
           colour = continent)) + 
  geom_point() + 
  scale_colour_viridis_d()

Transformar variables para mejorar visualización


Se puede realizar transformaciones sobre la marcha de las variables en los gráficos de {ggplot2}.

ggplot(data = gapminder2000, 
       mapping = aes(x = gdp, 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "PBI y esperanza de vida", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania", 
       x = "Producto Bruto Interno", 
       y = "Esperanza de Vida", 
       colour = "Continentes", 
       caption = "Fuente: Gapminder data") + 
  scale_colour_viridis_d()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), #< Ponemos log()
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  labs(title = "PBI y esperanza de vida", 
       subtitle = "Datos para Africa, Americas, Asia, Europa y Oceania", 
       x = "Logaritmo de Producto Bruto Interno", #< Editamos nombre
       y = "Esperanza de Vida", 
       colour = "Continentes", 
       caption = "Fuente: Gapminder data") + 
  scale_colour_viridis_d()

Nuestro turno


 

  • Descargue la carpeta comaprtida denominada taller02.

  • Abra el proyecto taller02.Rproj.

  • Abra el archivo quarto taller02.qmd.

  • Renderice el archivo quarto taller02.qmd. Abra el archivo taller02.html generado.

  • Desarrolle la PRIMERA PARTE del taller. Al final, renderice el archivo.

10:00

Estéticas

Agenda

  1. Visualización de datos

  2. Código paso a paso

  3. Estéticas

  4. Datos ‘tidy’

  5. El Operador Pipe

  6. Principios del manejo de datos con {dplyr}

Opciones de estéticas


 

Las características comunmente usadas en los gráficos que pueden ser mapeadas a variables específicas en los datos:

  • color

  • forma

  • tamaño

  • alfa (transparencia)

Color


ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent)) + 
  geom_point() + 
  scale_colour_viridis_d()

Forma


  • Forma mapeada a variable adicional
ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = region)) + 
  geom_point() + 
  scale_colour_viridis_d()

Forma


  • Forma mapeada a la misma variable
ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp),  
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point() + 
  scale_colour_viridis_d()

Tamaño


ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp),  
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent, 
                     size = population)) + 
  geom_point() + 
  scale_colour_viridis_d()

Alfa


ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent, 
                     size = population, 
                     alpha = population)) + 
  geom_point() + 
  scale_colour_viridis_d()

Mapeo versus Configuración


Mapeo

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent, 
                     size = population, 
                     alpha = population)) + 
  geom_point() + 
  scale_colour_viridis_d()

Configuración

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp),  
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d()

Mapeo vs. Configuración


  • Mapeo: Determina el tamaño, alfa, etc. de los puntos basados en el valor de un variable en los datos:

    • Conocido en inglés como mapping.

    • Se configura como: aes()

  • Configuración: Determina el tamaño, alfa, etc. de los puntos SIN basarse en el valor de un variable en los datos:

    • Conocido en inglés como setting.

    • Se configura como: geom_* (en este caso fue geom_point, pero hay otras geometrías más)

Temas pre-definidos de {ggplot2}.


 

  • {ggplot2} ofrece una serie de temas predinidos.

  • Un tema predefinido es una configuración pre-definida de componentes no dependientes de los datos (títulos, etiquetas, fuentes, fondo, grilas, leyendas, etc.) que pueden ser usados para darle un aspecto consistente a los gráficos.

  • Más info sobre los temas completas pre-definidos se pueden encontra en el siguiente enlace: Ver aquí.

  • Uno también puede personalizar sus propios temas: Ver aquí.

Temas completos


  • theme_gray (por defecto)

  • theme_bw()

  • theme_linedraw()

  • theme_light()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_gray()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_bw()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_linedraw()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_light()

Temas completos (parte 2)


  • theme_dark()

  • theme_minimal()

  • theme_classic()

  • theme_void()

  • theme_test()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_dark()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_minimal()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_classic()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_void()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy, 
                     colour = continent, 
                     shape = continent)) + 
  geom_point(size = 2, alpha = 0.5) + 
  scale_colour_viridis_d() + 
  theme_test()

Facetado


  • Se puede dividir la imagen en varias subimágenes de acuerdo a alguna otra condición.

  • Muy útil cuando se tienen grandes de datos y es de interés mostrar sus relaciones con varias variables.

  • Hay dos tipos de facetado:

    • facet_grid

    • facet_wrap

Facetado


ggplot(data = gapminder, 
       mapping = aes(x = year, 
                     y = life_expectancy)) + 
  geom_point() + 
  facet_grid(continent ~ .) + 
  scale_colour_viridis_d() + 
  theme_bw()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy)) + 
  geom_point() + 
  facet_grid(. ~ continent) + 
  scale_colour_viridis_d() + 
  theme_bw()

ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy)) + 
  geom_point() + 
  facet_wrap(continent ~ . ) + 
  scale_colour_viridis_d() + 
  theme_bw()
ggplot(data = gapminder2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy)) + 
  geom_point() + 
  facet_wrap(. ~ continent) + 
  scale_colour_viridis_d() + 
  theme_bw()

ggplot(data = gapminder1980_2000, 
       mapping = aes(x = log(gdp), 
                     y = life_expectancy)) + 
  geom_point() + 
  facet_grid(year ~ continent) + 
  scale_colour_viridis_d() + 
  theme_bw()

Nuestro turno


  • Trabaje con el mismo archivo quarto taller02.qmd.

  • Desarrolle la SEGUNDA PARTE de este taller siguiendo las instrucciones.

  • Al finalizar, renderice el archivo quarto.

  • Observe el archivo taller02.html.

 

10:00

Hagamos una pausa


Tomemos un descanso de 5 minutos

Estire las piernas

Deje de ver las pantallas

… cualquier , las del celular también.

05:00

Datos ‘tidy’

Agenda

  1. Visualización de datos

  2. Código paso a paso

  3. Estéticas

  4. Datos ‘tidy’

  5. El Operador Pipe

  6. Principios del manejo de datos con {dplyr}

Datos ‘tidy’




Características de los datos ordenados o ‘tidy’

  • Cada variable forma un columna.
  • Cada observación forma una fila.
  • Cada tipo de unidad observacional forma una tabla.

Características de los datos desordenados o ‘untidy’

!@#$%^&*()

Gramática de manejo de datos


Al igual que {ggplot}, el paquete {dplyr}, también de {tidyverse}, ofrece toda una gramática llena de funciones que actúan como verbos para manipular data.frames.

  • select: extrae columnas usando nombres
  • arrange: reordena filas
  • slice: extrae filas usando índices
  • filter: extrae filas que coincidan con criterios lógicos
  • distinct: filtra por filas únicas
  • mutate: agrega nuevas variables
  • summarise: reduce variables a valores
  • group_by: para operacionesa agrupadas
  • … (mucho más)

Reglas de las funciones de {dplyr}



  • El primer argumento siempre es el data frame.

  • Los argumentos subsecuentes dicen qué hacer con el data frame.

  • Siempre retorna un data frame.

  • No altera el data frame original.

Ejemplo de función {dplyr} en acción: seleccionar columna

 

Ver solamente country (países):

select(gapminder, country)
# A tibble: 10,545 × 1
   country            
   <fct>              
 1 Albania            
 2 Algeria            
 3 Angola             
 4 Antigua and Barbuda
 5 Argentina          
 6 Armenia            
 7 Aruba              
 8 Australia          
 9 Austria            
10 Azerbaijan         
# … with 10,535 more rows

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
  • Inicia con la función (un verbo): select()

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
  • Inicia con la función (un verbo): select()

  • Primer argumento: data frame con el que trabajaremos, gapminder

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
  • Inicia con la función (un verbo): select()

  • Primer argumento: data frame con el que trabajaremos, gapminder

  • Segundo argumento: variable que queremos seleccionar, country

Reglas de las funciones de {dplyr} en acción


select(
  gapminder, 
  country
)
# A tibble: 10,545 × 1
   country            
   <fct>              
 1 Albania            
 2 Algeria            
 3 Angola             
 4 Antigua and Barbuda
 5 Argentina          
 6 Armenia            
 7 Aruba              
 8 Australia          
 9 Austria            
10 Azerbaijan         
# … with 10,535 more rows
  • Inicia con la función (un verbo): select()

  • Primer argumento: data frame con el que trabajaremos, gapminder

  • Segundo argumento: variable que queremos seleccionar, country

  • Resultado: data frame con 10545 filas y 1 columna

Entra data frame / tibble, sale data frame / tiblble


Las funciones de dplyr siempre esperan un data frame y siempre generan un data frame.

  • Entra:
class(gapminder)
[1] "tbl_df"     "tbl"        "data.frame"
  • Sale:
select(gapminder, continent) %>% 
  class()
[1] "tbl_df"     "tbl"        "data.frame"

El Operador Pipe

Agenda

  1. Visualización de datos

  2. Código paso a paso

  3. Estéticas

  4. Datos ‘tidy’

  5. El Operador Pipe

  6. Principios del manejo de datos con {dplyr}

¿Qué es un pipe?


En programación, un pipe es una técnica para transmitir información de un proceso a otro.

  • En R, hay dos operadores pipe:

    • pipe de tidyverse: %>%

    • pipe nativo (de R base):|>

  • En este curso, usaremos el pipe de tidyverse: %>%

  • El operador pipe de tidyverse es del paquete {magrittr}, que no necesita ser cargado si es que se carga {tidyverse}.

%>% en acción


Este operador conecta secuencia de acciones en forma de código:

yo
despierto a las
salgo de cama por el
visto y
salgo de casa con sin

yo %>% 
  despertar(tiempo = "8:00") %>% 
  salir_de_cama(lado = "derecha") %>% 
  vestir(pantalones = TRUE, polo = TRUE) %>% 
  salir_de_casa(carro = TRUE, bicicleta = TRUE)

Atajo de teclado del operador pipe:

  • Ctrl + Shift + M

  • Ctrl + + M

Un ejemplo de uso de %>%


Sin %>%:

datos_fase1 <- read_stata("maca_meno_fase1.dta") 
datos_fase1 <- as_factor(datos_fase1)
  • El código es redundante: repites tres veces datos_fase1.
head(datos_fase1)
# A tibble: 6 × 14
     id time     treat     age race  married marri…¹ proce…² weight height    e2
  <dbl> <fct>    <fct>   <dbl> <chr> <fct>   <fct>   <chr>    <dbl>  <dbl> <dbl>
1     1 Baseline Placebo    33 Mest… Single  Withou… Callao    59      1.4  87.3
2     1 3 months Placebo    32 Mest… Single  Withou… Callao    59.9    1.3 210. 
3     2 Baseline Dosis 2    27 Mest… Single  Withou… Santa …   62      1.5 169. 
4     2 3 months Dosis 2    27 Mest… Single  Withou… Santa …   62.1    1.6  99.9
5     3 Baseline Dosis 1    25 Mest… Single  Withou… Callao    62      1.6  78.8
6     3 3 months Dosis 1    25 Mest… Single  Withou… Callao    60      1.6 155. 
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>, and abbreviated
#   variable names ¹​married2, ²​procedence

Con %>%:

datos_fase1 <- read_stata("maca_meno_fase1.dta") %>% 
  as_factor()
  • El código es más simple y directo, datos_fase1 solo se repite una vez.
head(datos_fase1)
# A tibble: 6 × 14
     id time     treat     age race  married marri…¹ proce…² weight height    e2
  <dbl> <fct>    <fct>   <dbl> <chr> <fct>   <fct>   <chr>    <dbl>  <dbl> <dbl>
1     1 Baseline Placebo    33 Mest… Single  Withou… Callao    59      1.4  87.3
2     1 3 months Placebo    32 Mest… Single  Withou… Callao    59.9    1.3 210. 
3     2 Baseline Dosis 2    27 Mest… Single  Withou… Santa …   62      1.5 169. 
4     2 3 months Dosis 2    27 Mest… Single  Withou… Santa …   62.1    1.6  99.9
5     3 Baseline Dosis 1    25 Mest… Single  Withou… Callao    62      1.6  78.8
6     3 3 months Dosis 1    25 Mest… Single  Withou… Callao    60      1.6 155. 
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>, and abbreviated
#   variable names ¹​married2, ²​procedence

Principios del manejo de datos con {dplyr}

Agenda

  1. Visualización de datos

  2. Código paso a paso

  3. Estéticas

  4. Datos ‘tidy’

  5. El Operador Pipe

  6. Principios del manejo de datos con {dplyr}

El paquete {dplyr} es una ‘suite’ de funciones para manipular data frame.

Verbos Función
Extrae filas con filter()
Extrae columnas con select()
Reordena filas con arrange()
Crea nuevas / remplaza columnas con mutate
Haz resumenes agrupados con group_by() y summarize()

Selección de columnas con select()


  • La función select() selecciona o excluye columnas.

  • El signo - permite elegir qué columnas eliminar.

  • A veces es mejor llamarla usando: dplyr::select() debido a que otros paquetes también tienen una función con el mismo nombre.

Larga

select(.data = DATA, ...)

Abreviada

select(DATA, ...)

Se estila usar %>%

DATA %>% 
  select(...)
Argumento Descripción
.data Data frame o extensión de data frame (por ejemplo, tibble).
... Una o más nombres de variables sin ' ' o expresiones como x:y que permiten seleccionar rango de variables.

select() en acción


  • Si solo quiero seleccionar a id, time, age, race y procedence:
datos_fase1 %>% 
  select(id, time, age, race, procedence)
# A tibble: 106 × 5
      id time       age race    procedence 
   <dbl> <fct>    <dbl> <chr>   <chr>      
 1     1 Baseline    33 Mestiza Callao     
 2     1 3 months    32 Mestiza Callao     
 3     2 Baseline    27 Mestiza Santa Anita
 4     2 3 months    27 Mestiza Santa Anita
 5     3 Baseline    25 Mestiza Callao     
 6     3 3 months    25 Mestiza Callao     
 7     4 Baseline    37 Mestiza Callao     
 8     4 3 months    38 Mestiza Callao     
 9     5 Baseline    31 Mestiza La Molina  
10     5 3 months    32 Mestiza La Molina  
# … with 96 more rows
  • Si quisiera excluir a procedence:
datos_fase1 %>% 
  select(-procedence)
# A tibble: 106 × 13
      id time  treat   age race  married marri…¹ weight height    e2    lh   fsh
   <dbl> <fct> <fct> <dbl> <chr> <fct>   <fct>    <dbl>  <dbl> <dbl> <dbl> <dbl>
 1     1 Base… Plac…    33 Mest… Single  Withou…   59      1.4  87.3  3.28  1.95
 2     1 3 mo… Plac…    32 Mest… Single  Withou…   59.9    1.3 210.  26.8   8.83
 3     2 Base… Dosi…    27 Mest… Single  Withou…   62      1.5 169.   6.34  4.32
 4     2 3 mo… Dosi…    27 Mest… Single  Withou…   62.1    1.6  99.9  5.77  1.7 
 5     3 Base… Dosi…    25 Mest… Single  Withou…   62      1.6  78.8 11.9   2.81
 6     3 3 mo… Dosi…    25 Mest… Single  Withou…   60      1.6 155.  10.1   4.51
 7     4 Base… Dosi…    37 Mest… Divorc… Withou…   60.9    1.5  41.0  4.57  3.81
 8     4 3 mo… Dosi…    38 Mest… Divorc… Withou…   61.4    1.5 109.   7.29  2.39
 9     5 Base… Plac…    31 Mest… Single  Withou…   64      1.5  43.0  7.81  2.01
10     5 3 mo… Plac…    32 Mest… Single  Withou…   58.1    1.6  56.0  9.15  3.66
# … with 96 more rows, 1 more variable: prog <dbl>, and abbreviated variable
#   name ¹​married2
  • Si se quiere seleccionar variables contiguas age, race, married, married2, y procedence.
datos_fase1 %>% 
  select(age:procedence)
# A tibble: 106 × 5
     age race    married  married2       procedence 
   <dbl> <chr>   <fct>    <fct>          <chr>      
 1    33 Mestiza Single   Without couple Callao     
 2    32 Mestiza Single   Without couple Callao     
 3    27 Mestiza Single   Without couple Santa Anita
 4    27 Mestiza Single   Without couple Santa Anita
 5    25 Mestiza Single   Without couple Callao     
 6    25 Mestiza Single   Without couple Callao     
 7    37 Mestiza Divorced Without couple Callao     
 8    38 Mestiza Divorced Without couple Callao     
 9    31 Mestiza Single   Without couple La Molina  
10    32 Mestiza Single   Without couple La Molina  
# … with 96 more rows
  • Se usa el operador <-:
datos_fase1_select <- datos_fase1 %>% 
  select(id, time, treat, age, race)
  • También se puede invertir el operador ->:
datos_fase1 %>% 
    select(id, time, treat, age, procedence) -> datos_fase1_select
  • Una vez guardado como objeto, podemos reutilizarlo para otros fines:
datos_fase1_select
# A tibble: 106 × 5
      id time     treat     age procedence 
   <dbl> <fct>    <fct>   <dbl> <chr>      
 1     1 Baseline Placebo    33 Callao     
 2     1 3 months Placebo    32 Callao     
 3     2 Baseline Dosis 2    27 Santa Anita
 4     2 3 months Dosis 2    27 Santa Anita
 5     3 Baseline Dosis 1    25 Callao     
 6     3 3 months Dosis 1    25 Callao     
 7     4 Baseline Dosis 1    37 Callao     
 8     4 3 months Dosis 1    38 Callao     
 9     5 Baseline Placebo    31 La Molina  
10     5 3 months Placebo    32 La Molina  
# … with 96 more rows

Arreglar en orden ascendente / descendente con arrange()


datos_fase1_select %>% 
  arrange(age)
# A tibble: 106 × 5
      id time     treat     age procedence
   <dbl> <fct>    <fct>   <dbl> <chr>     
 1    40 Baseline Placebo    20 VES       
 2    40 3 months Placebo    20 VES       
 3    20 Baseline Placebo    22 Surquillo 
 4    20 3 months Placebo    22 Surquillo 
 5    29 Baseline Dosis 1    23 SJL       
 6    29 3 months Dosis 1    23 SJL       
 7    39 Baseline Dosis 2    23 Callao    
 8    39 3 months Dosis 2    23 Callao    
 9     3 Baseline Dosis 1    25 Callao    
10     3 3 months Dosis 1    25 Callao    
# … with 96 more rows
datos_fase1_select %>% 
  arrange(desc(age))
# A tibble: 106 × 5
      id time     treat     age procedence
   <dbl> <fct>    <fct>   <dbl> <chr>     
 1    22 Baseline Dosis 1    41 Chorrillos
 2    22 3 months Dosis 1    41 Chorrillos
 3    33 Baseline Dosis 2    41 SJL       
 4    33 3 months Dosis 2    41 SJL       
 5    51 Baseline Dosis 1    41 Surco     
 6    51 3 months Dosis 1    41 Surco     
 7    17 Baseline Placebo    40 Surquillo 
 8    17 3 months Placebo    40 Surquillo 
 9    28 Baseline Dosis 2    40 SJL       
10    28 3 months Dosis 2    40 SJL       
# … with 96 more rows

Seleccionar filas


  • De acuerdo a índice (posición de fila):

    • slice( )
  • De acuerdo a condición:

    • filter( )

Rebanar filas con slice( )


  • Seleccionar las 3 primeras filas:
datos_fase1 %>% 
  slice(1:3)
# A tibble: 3 × 14
     id time     treat     age race  married marri…¹ proce…² weight height    e2
  <dbl> <fct>    <fct>   <dbl> <chr> <fct>   <fct>   <chr>    <dbl>  <dbl> <dbl>
1     1 Baseline Placebo    33 Mest… Single  Withou… Callao    59      1.4  87.3
2     1 3 months Placebo    32 Mest… Single  Withou… Callao    59.9    1.3 210. 
3     2 Baseline Dosis 2    27 Mest… Single  Withou… Santa …   62      1.5 169. 
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>, and abbreviated
#   variable names ¹​married2, ²​procedence
  • Seleccionar las filas 3, 6, 10:
datos_fase1 %>% 
  slice(c(3, 6, 10))
# A tibble: 3 × 14
     id time     treat     age race  married marri…¹ proce…² weight height    e2
  <dbl> <fct>    <fct>   <dbl> <chr> <fct>   <fct>   <chr>    <dbl>  <dbl> <dbl>
1     2 Baseline Dosis 2    27 Mest… Single  Withou… Santa …   62      1.5 169. 
2     3 3 months Dosis 1    25 Mest… Single  Withou… Callao    60      1.6 155. 
3     5 3 months Placebo    32 Mest… Single  Withou… La Mol…   58.1    1.6  56.0
# … with 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>, and abbreviated
#   variable names ¹​married2, ²​procedence
  • Excluir filas 1 y 3
datos_fase1 %>% 
  slice(-c(1, 3))
# A tibble: 104 × 14
      id time     treat    age race  married marri…¹ proce…² weight height    e2
   <dbl> <fct>    <fct>  <dbl> <chr> <fct>   <fct>   <chr>    <dbl>  <dbl> <dbl>
 1     1 3 months Place…    32 Mest… Single  Withou… Callao    59.9    1.3 210. 
 2     2 3 months Dosis…    27 Mest… Single  Withou… Santa …   62.1    1.6  99.9
 3     3 Baseline Dosis…    25 Mest… Single  Withou… Callao    62      1.6  78.8
 4     3 3 months Dosis…    25 Mest… Single  Withou… Callao    60      1.6 155. 
 5     4 Baseline Dosis…    37 Mest… Divorc… Withou… Callao    60.9    1.5  41.0
 6     4 3 months Dosis…    38 Mest… Divorc… Withou… Callao    61.4    1.5 109. 
 7     5 Baseline Place…    31 Mest… Single  Withou… La Mol…   64      1.5  43.0
 8     5 3 months Place…    32 Mest… Single  Withou… La Mol…   58.1    1.6  56.0
 9     6 Baseline Place…    38 Mest… Married With c… Los Ol…   54.5    1.5  36.2
10     6 3 months Place…    38 Mest… Married With c… Los Ol…   53.9    1.5  44.7
# … with 94 more rows, 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>, and
#   abbreviated variable names ¹​married2, ²​procedence

Filtrado de filas con filter()


  • La función filter() selecciona individuos que cumplen una condición lógica.

  • Se debe usar operadores booleanos para construir condiciones lógicas simples o complejas.

Larga

filter(.data = DATA, ...)

Abreviada

filter(DATA, ...)

Se estila usar %>%

DATA %>% 
  filter(...)
Argumento Descripción
.data Data frame o extensión de data frame (por ejemplo, tibble).
... Uno o más condiciones o pruebas que filter() evaluará en cada fila y seleccionará solo las condiciones que resulten verdaderas: TRUE.

Operadores lógicos con R


Operador Definición Operador Definición
< menor que A | B A o B
<= menor o igual que is.na(A) evalúa si A es NA
> mayor que !is.na(A) evalúa si A no es NA
>= mayor o igual que A %in% B evalúa si A está en B
== exactamente igual a !(A %in% B) evalúa si A no está en B
!= diferente de !A no A
A & B A y B

filter( ) en acción


  • Si se filtra solo para tener a los individuos en su medición basal:
datos_fase1_select %>% 
  filter(time == "Baseline")
# A tibble: 53 × 5
      id time     treat     age procedence  
   <dbl> <fct>    <fct>   <dbl> <chr>       
 1     1 Baseline Placebo    33 Callao      
 2     2 Baseline Dosis 2    27 Santa Anita 
 3     3 Baseline Dosis 1    25 Callao      
 4     4 Baseline Dosis 1    37 Callao      
 5     5 Baseline Placebo    31 La Molina   
 6     6 Baseline Placebo    38 Los Olivos  
 7     7 Baseline Dosis 1    26 SMP         
 8     8 Baseline Placebo    34 Carabayllo  
 9     9 Baseline Dosis 2    30 SMP         
10    10 Baseline Placebo    38 Pueblo Libre
# … with 43 more rows
  • Podemos querer filtrar a los individuos en la medición basal Y que sean placebo:
datos_fase1_select %>% 
  filter(time == "Baseline" & treat == "Placebo")
# A tibble: 17 × 5
      id time     treat     age procedence       
   <dbl> <fct>    <fct>   <dbl> <chr>            
 1     1 Baseline Placebo    33 Callao           
 2     5 Baseline Placebo    31 La Molina        
 3     6 Baseline Placebo    38 Los Olivos       
 4     8 Baseline Placebo    34 Carabayllo       
 5    10 Baseline Placebo    38 Pueblo Libre     
 6    14 Baseline Placebo    33 Surquillo        
 7    15 Baseline Placebo    37 Comas            
 8    17 Baseline Placebo    40 Surquillo        
 9    18 Baseline Placebo    36 Miraflores       
10    20 Baseline Placebo    22 Surquillo        
11    21 Baseline Placebo    29 SJL              
12    25 Baseline Placebo    37 San Borja        
13    26 Baseline Placebo    32 Chosica          
14    40 Baseline Placebo    20 VES              
15    43 Baseline Placebo    36 Villa el Salvador
16    45 Baseline Placebo    35 Los Olivos       
17    48 Baseline Placebo    27 Callao           
datos_fase1_select %>% 
  filter(time == "Baseline", treat == "Placebo")
# A tibble: 17 × 5
      id time     treat     age procedence       
   <dbl> <fct>    <fct>   <dbl> <chr>            
 1     1 Baseline Placebo    33 Callao           
 2     5 Baseline Placebo    31 La Molina        
 3     6 Baseline Placebo    38 Los Olivos       
 4     8 Baseline Placebo    34 Carabayllo       
 5    10 Baseline Placebo    38 Pueblo Libre     
 6    14 Baseline Placebo    33 Surquillo        
 7    15 Baseline Placebo    37 Comas            
 8    17 Baseline Placebo    40 Surquillo        
 9    18 Baseline Placebo    36 Miraflores       
10    20 Baseline Placebo    22 Surquillo        
11    21 Baseline Placebo    29 SJL              
12    25 Baseline Placebo    37 San Borja        
13    26 Baseline Placebo    32 Chosica          
14    40 Baseline Placebo    20 VES              
15    43 Baseline Placebo    36 Villa el Salvador
16    45 Baseline Placebo    35 Los Olivos       
17    48 Baseline Placebo    27 Callao           
  • Podemos querer filtrar a los individuos en la medición basal O que sean placebo:
datos_fase1_select %>% 
  filter(time == "Baseline" | treat == "Placebo")
# A tibble: 70 × 5
      id time     treat     age procedence 
   <dbl> <fct>    <fct>   <dbl> <chr>      
 1     1 Baseline Placebo    33 Callao     
 2     1 3 months Placebo    32 Callao     
 3     2 Baseline Dosis 2    27 Santa Anita
 4     3 Baseline Dosis 1    25 Callao     
 5     4 Baseline Dosis 1    37 Callao     
 6     5 Baseline Placebo    31 La Molina  
 7     5 3 months Placebo    32 La Molina  
 8     6 Baseline Placebo    38 Los Olivos 
 9     6 3 months Placebo    38 Los Olivos 
10     7 Baseline Dosis 1    26 SMP        
# … with 60 more rows
  • Si queremos solo las mujeres entre 34 y 38 años de edad:
datos_fase1_select %>% 
  filter(age >= 34 & age <= 38)
# A tibble: 36 × 5
      id time     treat     age procedence  
   <dbl> <fct>    <fct>   <dbl> <chr>       
 1     4 Baseline Dosis 1    37 Callao      
 2     4 3 months Dosis 1    38 Callao      
 3     6 Baseline Placebo    38 Los Olivos  
 4     6 3 months Placebo    38 Los Olivos  
 5     8 Baseline Placebo    34 Carabayllo  
 6     8 3 months Placebo    34 Carabayllo  
 7    10 Baseline Placebo    38 Pueblo Libre
 8    10 3 months Placebo    38 Pueblo Libre
 9    11 Baseline Dosis 2    37 El Agustino 
10    11 3 months Dosis 2    36 El Agustino 
# … with 26 more rows
  • Si queremos a quienes son de Santa Anita, Callao, SMP o Carabayllo:
datos_fase1 %>% 
  filter(procedence == "Santa Anita" | procedence == "Callao" | procedence == "SMP")
# A tibble: 22 × 14
      id time     treat    age race  married marri…¹ proce…² weight height    e2
   <dbl> <fct>    <fct>  <dbl> <chr> <fct>   <fct>   <chr>    <dbl>  <dbl> <dbl>
 1     1 Baseline Place…    33 Mest… Single  Withou… Callao    59      1.4  87.3
 2     1 3 months Place…    32 Mest… Single  Withou… Callao    59.9    1.3 210. 
 3     2 Baseline Dosis…    27 Mest… Single  Withou… Santa …   62      1.5 169. 
 4     2 3 months Dosis…    27 Mest… Single  Withou… Santa …   62.1    1.6  99.9
 5     3 Baseline Dosis…    25 Mest… Single  Withou… Callao    62      1.6  78.8
 6     3 3 months Dosis…    25 Mest… Single  Withou… Callao    60      1.6 155. 
 7     4 Baseline Dosis…    37 Mest… Divorc… Withou… Callao    60.9    1.5  41.0
 8     4 3 months Dosis…    38 Mest… Divorc… Withou… Callao    61.4    1.5 109. 
 9     7 Baseline Dosis…    26 Mest… Married With c… SMP       59.1    1.6  91.3
10     7 3 months Dosis…    26 Mest… Married With c… SMP       58.6    1.6  91.3
# … with 12 more rows, 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>, and
#   abbreviated variable names ¹​married2, ²​procedence
datos_fase1 %>% 
  filter(procedence %in% c("Santa Anita", "Callao", "SMP"))
# A tibble: 22 × 14
      id time     treat    age race  married marri…¹ proce…² weight height    e2
   <dbl> <fct>    <fct>  <dbl> <chr> <fct>   <fct>   <chr>    <dbl>  <dbl> <dbl>
 1     1 Baseline Place…    33 Mest… Single  Withou… Callao    59      1.4  87.3
 2     1 3 months Place…    32 Mest… Single  Withou… Callao    59.9    1.3 210. 
 3     2 Baseline Dosis…    27 Mest… Single  Withou… Santa …   62      1.5 169. 
 4     2 3 months Dosis…    27 Mest… Single  Withou… Santa …   62.1    1.6  99.9
 5     3 Baseline Dosis…    25 Mest… Single  Withou… Callao    62      1.6  78.8
 6     3 3 months Dosis…    25 Mest… Single  Withou… Callao    60      1.6 155. 
 7     4 Baseline Dosis…    37 Mest… Divorc… Withou… Callao    60.9    1.5  41.0
 8     4 3 months Dosis…    38 Mest… Divorc… Withou… Callao    61.4    1.5 109. 
 9     7 Baseline Dosis…    26 Mest… Married With c… SMP       59.1    1.6  91.3
10     7 3 months Dosis…    26 Mest… Married With c… SMP       58.6    1.6  91.3
# … with 12 more rows, 3 more variables: lh <dbl>, fsh <dbl>, prog <dbl>, and
#   abbreviated variable names ¹​married2, ²​procedence

Podemos anidar con %>% varias tareas


  • Esto se denomina establecer un pipeline:
datos_fase1 %>% 
  filter(age > 35) %>% # Primero filtro por age
  select(id, time, treat, race, age) %>% # Luego me quedo solo con estas 5 columnas
  arrange(age) # Por último, reordenamos por edad
# A tibble: 40 × 5
      id time     treat   race      age
   <dbl> <fct>    <fct>   <chr>   <dbl>
 1    11 3 months Dosis 2 Mestiza    36
 2    18 Baseline Placebo Mestiza    36
 3    18 3 months Placebo Mestiza    36
 4    43 Baseline Placebo Mestiza    36
 5    43 3 months Placebo Mestiza    36
 6    46 Baseline Dosis 2 Mestiza    36
 7    46 3 months Dosis 2 Mestiza    36
 8     4 Baseline Dosis 1 Mestiza    37
 9    11 Baseline Dosis 2 Mestiza    37
10    15 Baseline Placebo Mestiza    37
# … with 30 more rows

Hagamos una pausa


Tomemos un descanso de 5 minutos

Estire las piernas

Deje de ver las pantallas

… cualquier , las del celular también.

05:00

Nuestro turno


  • Trabaje con el mismo archivo quarto taller02.qmd.

  • Desarrolle la TERCERA PARTE de este taller siguiendo las instrucciones.

  • Desarrolle la CUARTA PARTE de este taller siguiendo las instrucciones.

  • Desarrolle la QUINTA PARTE de este taller siguiendo las instrucciones.

  • Al finalizar, renderice el archivo quarto.

  • Observe el archivo taller02.html generado.

 

30:00

¡Gracias!
¿Preguntas?




@psotob91

https://github.com/psotob91

percys1991@gmail.com